// extern crate ipnet;

use std::net::{Ipv4Addr, Ipv6Addr};
use std::str::FromStr;
use ipnet::{IpNet, Ipv4Net, Ipv6Net};

fn main() {
    // 从其构造函数创建 Ipv4Net 和 Ipv6Net。
    let net4 = Ipv4Net::new(Ipv4Addr::new(192, 168, 0, 0), 24).unwrap();
    let net6 = Ipv6Net::new(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 0), 64).unwrap();
    println!("net4={:?}", net4);
    println!("net6={:?}", net6);

    // 它们也可以从字符串表示形式创建
    let net4 = Ipv4Net::from_str("10.1.1.0/24").unwrap();
    let net6 = Ipv6Net::from_str("fd00::/24").unwrap();
    println!("net4={:?}", net4);
    println!("net6={:?}", net6);

    println!("{} netmask = {}", net4, net4.netmask());

    // 字符串转换为 Ipv4Net 或 Ipv6Net 时，它们的地址和子网掩码必须是有效的。
    let net4: Ipv4Net = "192.168.1.1/24".parse().unwrap();
    let net6: Ipv6Net = "fd00::/24".parse().unwrap();

    //
    let net = "192.168.1.1/24".parse::<Ipv4Net>();

    // IpNet 可以表示 IPv4 或 IPv6 网络地址
    let net = IpNet::from(net4);
    println!("{:?} hostmask = {}", net, net.hostmask());

    let net = IpNet::from_str("fd00::/24");
    let net: IpNet = "10.1.1.0/24".parse().unwrap();
    let net = IpNet::from_str("192.168.1.1/24");



}
